home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / amiga / plotting / gnuplot3.lzh / gnuplot / term / hpljii.trm < prev    next >
Text File  |  1991-06-18  |  8KB  |  316 lines

  1. /* GNUPLOT - hpljii.trm */
  2. /*
  3.  * Copyright (C) 1990   
  4.  *
  5.  * Permission to use, copy, and distribute this software and its
  6.  * documentation for any purpose with or without fee is hereby granted, 
  7.  * provided that the above copyright notice appear in all copies and 
  8.  * that both that copyright notice and this permission notice appear 
  9.  * in supporting documentation.
  10.  *
  11.  * Permission to modify the software is granted, but not the right to
  12.  * distribute the modified code.  Modifications are to be distributed 
  13.  * as patches to released version.
  14.  *  
  15.  * This software  is provided "as is" without express or implied warranty.
  16.  * 
  17.  * This file is included by ../term.c.
  18.  *
  19.  * This terminal driver supports:
  20.  *  hpljii, hpdj
  21.  *
  22.  * AUTHORS
  23.  *  John Engels
  24.  *  Russell Lang
  25.  *  Maurice Castro
  26.  *
  27.  * send your comments or suggestions to (pixar!info-gnuplot@sun.com).
  28.  * 
  29.  */
  30.  
  31. /* The following HP laserjet series II driver uses generic bit mapped graphics
  32.    routines from bitmap.c to build up a bit map in memory.  The driver
  33.    interchanges colomns and lines in order to access entire lines
  34.    easily and returns the lines to get bits in the right order :
  35.    (x,y) -> (y,XMAX-1-x). */
  36. /* This interchange is done by calling b_makebitmap() with reversed 
  37.    xmax and ymax, and then setting b_rastermode to TRUE.  b_setpixel()
  38.    will then perform the interchange before each pixel is plotted */
  39. /* by John Engels JENGELS@BNANDP51.BITNET, inspired by the hpljet driver
  40.    of Jyrki Yli-Nokari */
  41.  
  42. #ifdef HPLJII
  43.  
  44. /* We define 4 different print qualities : 300ppi, 150ppi, 100ppi and
  45.    75ppi.  (Pixel size = 1, 2, 3, 4 dots) */
  46.  
  47. #define HPLJII_DPP (hplj_dpp)   /* dots per pixel */
  48. #define HPLJII_PPI (300/HPLJII_DPP) /* pixel per inch */
  49. /* make XMAX and YMAX a multiple of 8 */
  50. #define HPLJII_XMAX (8*(unsigned int)(xsize*1920/HPLJII_DPP/8.0+0.9))
  51. #define HPLJII_YMAX (8*(unsigned int)(ysize*1920/HPLJII_DPP/8.0+0.9))
  52.  
  53. #define HPLJII_VCHAR (HPLJII_PPI/6) /* Courier font with 6 lines per inch */
  54. #define HPLJII_HCHAR (HPLJII_PPI/10) /* Courier font with 10 caracters
  55.                                         per inch */
  56.  
  57. /* default values for term_tbl */
  58. #define HPLJII_75PPI_XMAX (1920/4)
  59. #define HPLJII_75PPI_YMAX (1920/4)
  60. #define HPLJII_75PPI_HCHAR (1920/4/6)
  61. #define HPLJII_75PPI_VCHAR (1920/4/10)
  62. #define HPLJII_75PPI_VTIC 5
  63. #define HPLJII_75PPI_HTIC 5
  64.  
  65.  
  66. #define HPLJII_PUSH_CURSOR fprintf(outfile,"\033&f0S") /* Save current
  67.                   cursor position */
  68. #define HPLJII_POP_CURSOR fprintf(outfile,"\033&f1S") /* Restore
  69.                   cursor position */
  70. #define HPLJII_COURIER fprintf(outfile,"\033(0N\033(s0p10.0h12.0v0s0b3T\033&l6D")
  71.          /* be sure to use courier font with 6lpi and 10cpi */
  72.  
  73. static int hplj_dpp=4;
  74. /* bm_pattern not appropriate for 300ppi graphics */
  75. static unsigned int b_300ppi_pattern[] = {0xffff, 0x1111,
  76.         0xffff, 0x3333, 0x0f0f, 0x3f3f, 0x0fff, 0x00ff, 0x33ff};
  77.  
  78. HPLJIIoptions()
  79. {
  80. char opt[4];
  81.  
  82. #define HPDJERROR "expecting dots per inch size 75, 100, 150 or 300"
  83.     if (!END_OF_COMMAND) {
  84.         if (token[c_token].length>3)
  85.             int_error(HPDJERROR,c_token);
  86.  
  87.         /* almost_equals() won't accept numbers - use strcmp() instead */
  88.         capture(opt,c_token,c_token);
  89.         if (!strcmp(opt,"75")) {
  90.                hplj_dpp = 4;
  91.         }
  92.         else if (!strcmp(opt,"100")) {
  93.                hplj_dpp = 3;
  94.         }
  95.         else if (!strcmp(opt,"150")) {
  96.                hplj_dpp = 2;
  97.         }
  98.         else if (!strcmp(opt,"300")) {
  99.                hplj_dpp = 1;
  100.         } else {
  101.             int_error(HPDJERROR,c_token);
  102.         }
  103.         c_token++;
  104.     }
  105.  
  106.     term_tbl[term].xmax = HPLJII_XMAX;
  107.     term_tbl[term].ymax = HPLJII_YMAX;
  108.     switch(hplj_dpp) {
  109.         case 1:
  110.             strcpy(term_options,"300");
  111.             term_tbl[term].v_tic = 15;
  112.             term_tbl[term].h_tic = 15;
  113.             break;
  114.         case 2:
  115.             strcpy(term_options,"150");
  116.             term_tbl[term].v_tic = 8;
  117.             term_tbl[term].h_tic = 8;
  118.             break;
  119.         case 3:
  120.             strcpy(term_options,"100");
  121.             term_tbl[term].v_tic = 6;
  122.             term_tbl[term].h_tic = 6;
  123.             break;
  124.         case 4:
  125.             strcpy(term_options,"75");
  126.             term_tbl[term].v_tic = 5;
  127.             term_tbl[term].h_tic = 5;
  128.             break;
  129.     }
  130. }
  131.  
  132.  
  133. HPLJIIinit()
  134. {
  135. #ifdef vms
  136.    reopen_binary();
  137. #endif /* vms */
  138. #ifdef PC
  139.    reopen_binary();
  140. #endif /* PC */
  141. }
  142.  
  143.  
  144. HPLJIIgraphics()
  145. {
  146.    term_tbl[term].v_char = HPLJII_VCHAR;
  147.    term_tbl[term].h_char = HPLJII_HCHAR;
  148.    HPLJII_COURIER;
  149.    HPLJII_PUSH_CURSOR;
  150.    /* rotate plot -90 degrees by reversing XMAX and YMAX and by 
  151.       setting b_rastermode to TRUE */
  152.    b_makebitmap(HPLJII_YMAX,HPLJII_XMAX,1);
  153.    b_rastermode = TRUE;
  154. }
  155.  
  156.  
  157. /* HPLJIItext by rjl - no compression */
  158. HPLJIItext()
  159. {
  160.   register int x,j,row;
  161.  
  162.    fprintf(outfile,"\033*t%dR", HPLJII_PPI);
  163.    HPLJII_POP_CURSOR;
  164.    fprintf(outfile, "\033*r1A");
  165.  
  166.    /* dump bitmap in raster mode */
  167.    for (x = b_xsize-1; x >= 0; x--) {
  168.       row = (b_ysize/8)-1;
  169.       fprintf(outfile, "\033*b0m%dW", b_ysize/8);
  170.       for (j = row; j >= 0; j--) {
  171.          (void) fputc( (char)(*((*b_p)[j]+x)), outfile );
  172.       }
  173.    }
  174.    fprintf(outfile, "\033*rB");
  175.  
  176.    b_freebitmap();
  177.  
  178. #ifndef vms  /* most vms spoolers add a formfeed character */
  179.    fprintf(outfile,"\f");
  180. #endif /* not vms */
  181. }
  182.  
  183.  
  184.  
  185. HPLJIIlinetype(linetype)
  186. int linetype;
  187. {
  188.  
  189.    if (hplj_dpp == 1) {
  190.       if (linetype>=7)
  191.           linetype %= 7;
  192.       /* b_pattern not appropriate for 300ppi graphics */
  193.       b_linemask = b_300ppi_pattern[linetype+2];
  194.       b_maskcount=0;
  195.    }
  196.    else {
  197.       b_setlinetype(linetype);
  198.    }
  199. }
  200.  
  201. #define HPLJIImove b_move
  202. #define HPLJIIvector b_vector
  203. #define HPLJIItext_angle b_text_angle
  204.  
  205. HPLJIIput_text(x,y,str)
  206. unsigned int x, y;
  207. char *str;
  208. {
  209.    switch (b_angle) {
  210.       case 0:
  211.          y -= HPLJII_VCHAR/5;
  212.          HPLJII_POP_CURSOR;
  213.          HPLJII_PUSH_CURSOR;
  214.          /* (0,0) is the upper left point of the paper */
  215.          fprintf(outfile, "\033*p%+dx%+dY", x*HPLJII_DPP
  216.                                          ,  (HPLJII_YMAX-y-1)*HPLJII_DPP );
  217.          fputs(str, outfile);
  218. /*       for (; *str; ++str, x += HPLJII_HCHAR)
  219.             HPLJIIputc (x, y, *str, b_angle);*/
  220.          break;
  221.       case 1:
  222.          y += (HPLJII_HCHAR-2*HPLJII_VCHAR)/2;
  223.          y += (HPLJII_VCHAR+HPLJII_HCHAR)*strlen(str)/2;
  224.          for (; *str; ++str, y -= HPLJII_VCHAR)
  225.             HPLJIIputc (x, y, *str, b_angle);
  226.          break;
  227.    }
  228. }
  229.  
  230. HPLJIIputc(x,y,c,angle)
  231. unsigned int x,y;
  232. int angle;
  233. char c;
  234. {
  235.    HPLJII_POP_CURSOR;
  236.    HPLJII_PUSH_CURSOR;
  237.    /* (0,0) is the upper left point of the paper */
  238.    fprintf(outfile, "\033*p%+dx%+dY", x*HPLJII_DPP
  239.                                    ,  (HPLJII_YMAX-y-1)*HPLJII_DPP );
  240.    fputc(c, outfile);
  241. }
  242.  
  243.  
  244. HPLJIIreset()
  245. {
  246. #ifdef vms
  247.    fflush_binary();
  248. #endif /* vms */
  249. }
  250.  
  251.  
  252. /* HP DeskJet routines */
  253. HPDJgraphics()
  254. {
  255.     switch(hplj_dpp) {
  256.         case 1:
  257.             b_charsize(FNT13X25);
  258.             term_tbl[term].v_char = FNT13X25_VCHAR;
  259.             term_tbl[term].h_char = FNT13X25_HCHAR;
  260.             break;
  261.         case 2:
  262.             b_charsize(FNT13X25);
  263.             term_tbl[term].v_char = FNT13X25_VCHAR;
  264.             term_tbl[term].h_char = FNT13X25_HCHAR;
  265.             break;
  266.         case 3:
  267.             b_charsize(FNT9X17);
  268.             term_tbl[term].v_char = FNT9X17_VCHAR;
  269.             term_tbl[term].h_char = FNT9X17_HCHAR;
  270.             break;
  271.         case 4:
  272.             b_charsize(FNT5X9);
  273.             term_tbl[term].v_char = FNT5X9_VCHAR;
  274.             term_tbl[term].h_char = FNT5X9_HCHAR;
  275.             break;
  276.     }
  277.     /* rotate plot -90 degrees by reversing XMAX and YMAX and by 
  278.     setting b_rastermode to TRUE */
  279.     b_makebitmap(HPLJII_YMAX,HPLJII_XMAX,1);
  280.     b_rastermode = TRUE;
  281. }
  282.  
  283.  
  284. /* 0 compression raster bitmap dump. Compatible with HP DeskJet 500
  285.    hopefully compatible with other HP Deskjet printers */
  286. HPDJtext()
  287. {
  288.   register int x,j,row;
  289.  
  290.    fprintf(outfile,"\033*b0M");
  291.    fprintf(outfile,"\033*t%dR", HPLJII_PPI);
  292.    fprintf(outfile, "\033*r0A");
  293.  
  294.    /* dump bitmap in raster mode */
  295.    for (x = b_xsize-1; x >= 0; x--) {
  296.       row = (b_ysize/8)-1;
  297.       fprintf(outfile, "\033*b%dW", b_ysize/8);
  298.       for (j = row; j >= 0; j--) {
  299.          (void) fputc( (char)(*((*b_p)[j]+x)), outfile );
  300.       }
  301.    }
  302.    fprintf(outfile, "\033*rbC");
  303.  
  304.    b_freebitmap();
  305.  
  306. #ifndef vms  /* most vms spoolers add a formfeed character */
  307.    fprintf(outfile,"\f");
  308. #endif /* not vms */
  309. }
  310.  
  311. #define HPDJtext_angle b_text_angle
  312. #define HPDJput_text b_put_text
  313.  
  314. #endif /* HPLJII */
  315.  
  316.